"""RPA框架基础使用示例"""

from rpa_framework.core.robot import Robot
from rpa_framework.core.task import Task
from rpa_framework.core.workflow import Workflow
from rpa_framework.automation.desktop import DesktopAutomation
from rpa_framework.automation.browser import BrowserAutomation
from rpa_framework.utils.file_utils import FileUtils
from rpa_framework.utils.string_utils import StringUtils
from rpa_framework.config.config_manager import config_manager
from rpa_framework.logging.logger import get_logger
from rpa_framework.exceptions import TaskExecutionException, TimeoutException

# 获取日志记录器
logger = get_logger("rpa.example")


def main():
    """主函数：演示RPA框架的基本使用"""
    
    try:
        # 1. 初始化机器人
        logger.info("初始化RPA机器人...")
        robot = Robot(name="示例机器人", description="这是一个RPA框架演示机器人")
        robot.start()
        logger.info(f"机器人启动成功，状态: {robot.status}")
        
        # 2. 创建工具实例
        desktop = DesktopAutomation()
        browser = BrowserAutomation(browser_type="chrome")
        file_utils = FileUtils()
        string_utils = StringUtils()
        
        # 3. 创建任务
        logger.info("创建任务...")
        
        # 任务1: 创建示例文件
        def create_sample_file():
            """创建示例文件"""
            file_path = "sample_data.txt"
            content = "这是一个RPA框架创建的示例文件\n创建时间: 2024-01-01"
            file_utils.write_text_file(file_path, content)
            logger.info(f"示例文件已创建: {file_path}")
            return file_path
        
        task1 = Task(
            name="创建示例文件",
            description="创建一个简单的文本文件",
            function=create_sample_file,
            timeout=10
        )
        
        # 任务2: 格式化文本
        def format_text(file_path):
            """格式化文件内容"""
            content = file_utils.read_text_file(file_path)
            lines = content.splitlines()
            
            # 移除空行并标准化缩进
            formatted_lines = []
            for line in lines:
                stripped = line.strip()
                if stripped:
                    formatted_lines.append(f"• {stripped}")
            
            formatted_content = "\n".join(formatted_lines)
            file_utils.write_text_file("formatted_" + file_path, formatted_content)
            logger.info(f"文本已格式化并保存")
            return formatted_content
        
        task2 = Task(
            name="格式化文本",
            description="清理和格式化文件内容",
            function=format_text,
            dependencies=[task1],  # 依赖于task1完成
            timeout=10
        )
        
        # 任务3: 模拟浏览器操作
        def simulate_browser():
            """模拟简单的浏览器操作"""
            try:
                # 注意：这只是一个示例，实际运行需要安装Chrome驱动
                logger.info("模拟浏览器打开操作...")
                # 实际使用时可以取消下面的注释
                # browser.initialize()
                # browser.navigate("https://www.example.com")
                # browser.take_screenshot("example_page.png")
                # browser.close()
                logger.info("浏览器操作完成")
                return True
            except Exception as e:
                logger.warning(f"浏览器操作模拟失败: {e}")
                logger.warning("注意：实际运行浏览器自动化需要安装相应的浏览器驱动")
                return False
        
        task3 = Task(
            name="模拟浏览器操作",
            description="打开网页并截取屏幕",
            function=simulate_browser,
            timeout=30
        )
        
        # 任务4: 模拟桌面操作
        def simulate_desktop():
            """模拟简单的桌面操作"""
            try:
                logger.info("模拟桌面操作...")
                # 获取屏幕尺寸
                screen_size = desktop.get_screen_size()
                logger.info(f"屏幕尺寸: {screen_size[0]}x{screen_size[1]} 像素")
                
                # 注意：实际的鼠标/键盘操作在演示时被禁用
                logger.info("桌面操作模拟完成")
                return screen_size
            except Exception as e:
                logger.warning(f"桌面操作模拟失败: {e}")
                return None
        
        task4 = Task(
            name="模拟桌面操作",
            description="获取屏幕信息",
            function=simulate_desktop,
            timeout=15
        )
        
        # 任务5: 总结执行结果
        def summarize_results(*args):
            """总结所有任务的执行结果"""
            results = {}
            for i, arg in enumerate(args):
                results[f"任务{i+1}"] = str(arg)
                
            summary = f"\n执行结果汇总:\n"
            for task_name, result in results.items():
                summary += f"{task_name}: {result}\n"
            
            file_utils.write_text_file("execution_summary.txt", summary)
            logger.info(f"执行总结已保存到 execution_summary.txt")
            return summary
        
        task5 = Task(
            name="总结执行结果",
            description="汇总所有任务的执行结果",
            function=summarize_results,
            dependencies=[task2, task3, task4],  # 依赖于前三个任务完成
            timeout=5
        )
        
        # 4. 创建并执行工作流
        logger.info("创建并执行工作流...")
        workflow = Workflow(
            name="示例工作流",
            description="RPA框架演示工作流"
        )
        
        # 添加所有任务到工作流
        workflow.add_task(task1)
        workflow.add_task(task2)
        workflow.add_task(task3)
        workflow.add_task(task4)
        workflow.add_task(task5)
        
        # 验证工作流（检查依赖关系）
        is_valid = workflow.validate()
        logger.info(f"工作流验证结果: {'有效' if is_valid else '无效'}")
        
        if is_valid:
            # 使用机器人执行工作流
            robot.execute_workflow(workflow)
            logger.info(f"工作流执行完成，状态: {workflow.status}")
            
            # 获取工作流结果
            results = workflow.get_results()
            logger.info(f"工作流产生了 {len(results)} 个结果")
            
        # 5. 演示单独执行任务
        logger.info("演示单独执行任务...")
        try:
            # 创建一个简单的任务来演示单独执行
            simple_task = Task(
                name="简单计算任务",
                description="执行基本的计算操作",
                function=lambda x: x * 2,
                args=[100],
                timeout=5
            )
            
            result = robot.execute_task(simple_task)
            logger.info(f"单独任务执行结果: {result}")
            
        except TaskExecutionException as e:
            logger.error(f"任务执行异常: {e}")
        except TimeoutException as e:
            logger.error(f"任务执行超时: {e}")
        
        # 6. 机器人状态管理
        logger.info(f"\n机器人运行信息:\n"
                   f"- 状态: {robot.status}\n"
                   f"- 运行时间: {robot.run_time}秒\n"
                   f"- 已执行任务数: {robot.executed_tasks_count}\n"
                   f"- 成功任务数: {robot.successful_tasks_count}\n"
                   f"- 失败任务数: {robot.failed_tasks_count}")
        
    except Exception as e:
        logger.error(f"发生未预期的错误: {e}")
    
    finally:
        # 7. 停止机器人
        if 'robot' in locals():
            robot.stop()
            logger.info(f"机器人已停止，最终状态: {robot.status}")
        
        logger.info("RPA框架演示完成")


if __name__ == "__main__":
    # 设置日志级别（可选）
    config_manager.set("logging.level", "INFO")
    
    # 运行示例
    main()